package com.cbw.client;
import com.cbw.bean.Express;
import com.cbw.utils.MsgUtil;

import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;

/**
 * 快递的客户端
 * 作为视图层(控制台)和服务器的纽带，只负责数据的传递
 * 客户端与服务器端通信使用MsgUtil工具类即信息处理工具类负责两端通信
 */
public class ExpressClient {
    private Socket socket;

    /**
     * 搭建客户端对象,占用端口号12345,服务器端是自身ip
     * 当创建Socket对象时，就已经启动了客户端
     */
    public ExpressClient(){
        try {
            socket = new Socket("127.0.0.1", 12345);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭流 客户端socket
     */
    public void close(){
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 客户端咨询服务器快递柜是否满了
     * @return
     */
    public boolean isFull() throws IOException {
        //调用C/S间信息处理工具类，告诉服务器执行CMD_CHECKE_FULL命令表示的方法
        MsgUtil.sendStr(socket,MsgUtil.CMD_CHECKE_FULL);
        return MsgUtil.receiveBoolean(socket);//客户端接收服务器回写信息
    }

    /**客户端添加操作
     * 客户端并不直接添加，而是向服务器发送指令，让服务器调用DAO添加快递信息。
     * 1.发命令
     * 2.发需要的参数
     * 3.收结果
     * @param express
     * @return
     */
    public Express addExpress(Express express)throws IOException,ClassNotFoundException {
        //客户端向服务器发送命令，使用信息处理工具类
        MsgUtil.sendStr(socket,MsgUtil.CMD_ADD); //告诉服务器要添加操作
        //向服务器传递要添加的快递
        MsgUtil.sendExpress(socket,express);
        //服务器添加完成，客户端接收回写数据(是对象)
        Express add = MsgUtil.receiveExpress(socket);
        return add;
    }

    /**
     * 客户端删除操作
     * 向服务器发送命令和参数，等待服务器接收并执行命令后回写数据，客户端再接收
     * @param number
     * @return
     * @throws IOException
     */
    public Boolean removeExpress(String number) throws IOException {
        MsgUtil.sendStr(socket,MsgUtil.CMD_REMOVE); //向服务器发送命令
        MsgUtil.sendStr(socket,number);//向服务器发送参数
        boolean remove = MsgUtil.receiveBoolean(socket);//接收服务器回写数据
        return remove;
    }

    /**
     * 客户端根据单号查找快递是否存在
     * 向服务器发送查找命令并传递参数number,并等待服务器端响应数据回来
     * @param number
     * @return
     */
    public int findByNumber(String number) throws IOException {
        MsgUtil.sendStr(socket,MsgUtil.CMD_FIND_BY_NUMBER);//向服务器发送查找命令
        MsgUtil.sendStr(socket,number);//向服务器发送需要的数据
        int num=MsgUtil.receiveInt(socket);//客户端等待接收服务器响应的数据，不存在则返回-1
        return num;
    }

    /**修改快递信息
     * 发送命令
     * 传递数据(对象)
     * 接收服务器响应数据
     * @param oldExpress
     * @param newExpress
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public Express modifyExpress(Express oldExpress, Express newExpress) throws IOException, ClassNotFoundException {
        MsgUtil.sendStr(socket,MsgUtil.CMD_MODIFY);//客户端向服务器发送修改命令
        MsgUtil.sendExpress(socket,oldExpress);//向服务器传递旧对象
        MsgUtil.sendExpress(socket,newExpress);//向服务器传递新对象
        return MsgUtil.receiveExpress(socket);//等待接收服务器响应的数据(修改后的快递)
    }

    public ArrayList<Express> findAll() throws IOException, ClassNotFoundException {
        MsgUtil.sendStr(socket,MsgUtil.CMD_QUERY);//客户端向服务器发送查询命令去查询
        ArrayList<Express>list=MsgUtil.receiveList(socket);
        //客户端等待接收服务器传回的查询信息，接收后返回
        return list;
    }

    /**
     * 取快递(根据取件码删除快递)
     * 向服务器发送命令去执行取快递操作
     * 向服务器发送需要的数据socket和code
     * 然后等待接收服务器返回的数据
     * @param code
     * @return
     */
    public Express pickExpress(int code) throws IOException, ClassNotFoundException {
        MsgUtil.sendStr(socket,MsgUtil.CMD_PICK);//发送命令
        MsgUtil.sendInt(socket,code);//发送数据
        Express express = MsgUtil.receiveExpress(socket);//接收数据(取出的快递)
        return express;
    }
}